//************************************
//***Библиотека для работы с дисплеем
//************************************
#ifndef displayH
#define displayH

#include "cmsis_os.h"
#include "GPIO_STM32F4xx.h"  
#include "Keybord.h"

// **** управление битами***********************************
#define MSET_BIT0 |=0x01
#define MSET_BIT1 |=0x02
#define MSET_BIT2 |=0x04
#define MSET_BIT3 |=0x08
#define MSET_BIT4 |=0x10
#define MSET_BIT5 |=0x20
#define MSET_BIT6 |=0x40
#define MSET_BIT7 |=0x80
#define MSET_BIT8 |=0x100
#define MSET_BIT9 |=0x200
#define MSET_BIT10 |=0x400
#define MSET_BIT11 |=0x800
#define MSET_BIT12 |=0x1000
#define MSET_BIT13 |=0x2000
#define MSET_BIT14 |=0x4000
#define MSET_BIT15 |=0x8000
#define MSET_BIT16 |=0x10000
#define MSET_BIT17 |=0x20000
#define MSET_BIT18 |=0x40000
#define MSET_BIT19 |=0x80000
#define MSET_BIT20 |=0x100000
#define MSET_BIT21 |=0x200000
#define MSET_BIT22 |=0x400000
#define MSET_BIT23 |=0x800000
#define MSET_BIT24 |=0x1000000
#define MSET_BIT25 |=0x2000000
#define MSET_BIT26 |=0x4000000
#define MSET_BIT27 |=0x8000000
#define MSET_BIT28 |=0x10000000
#define MSET_BIT29 |=0x20000000
#define MSET_BIT30 |=0x40000000
#define MSET_BIT31 |=0x80000000

#define MRSET_BIT0 &=~0x01
#define MRSET_BIT1 &=~0x02
#define MRSET_BIT2 &=~0x04
#define MRSET_BIT3 &=~0x08
#define MRSET_BIT4 &=~0x10
#define MRSET_BIT5 &=~0x20
#define MRSET_BIT6 &=~0x40
#define MRSET_BIT7 &=~0x80
#define MRSET_BIT8 &=~0x100
#define MRSET_BIT9 &=~0x200
#define MRSET_BIT10 &=~0x400
#define MRSET_BIT11 &=~0x800
#define MRSET_BIT12 &=~0x1000
#define MRSET_BIT13 &=~0x2000
#define MRSET_BIT14 &=~0x4000
#define MRSET_BIT15 &=~0x8000
#define MRSET_BIT16 &=~0x10000
#define MRSET_BIT17 &=~0x20000
#define MRSET_BIT18 &=~0x40000
#define MRSET_BIT19 &=~0x80000
#define MRSET_BIT20 &=~0x100000
#define MRSET_BIT21 &=~0x200000
#define MRSET_BIT22 &=~0x400000
#define MRSET_BIT23 &=~0x800000
#define MRSET_BIT24 &=~0x1000000
#define MRSET_BIT25 &=~0x2000000
#define MRSET_BIT26 &=~0x4000000
#define MRSET_BIT27 &=~0x8000000
#define MRSET_BIT28 &=~0x10000000
#define MRSET_BIT29 &=~0x20000000
#define MRSET_BIT30 &=~0x40000000
#define MRSET_BIT31 &=~0x80000000
//***********************************************************   


// перечисления описания экрана который необходимо выставить на дисплее 
typedef enum _SELECTION_SCREEN
{
		START_SCREEN=0, 
		MAIN_SCREEN=1,
		RESULT_SCREEN=2,
		CONFIG_SCREEN=3		
}SELECTION_SCREEN;
// перечисления описания вида устанавливаемого параметра 
typedef enum _PARAMETER_SELECTION
{	
		DATE_TIME=0,			// дата время			
		FILTER=1, 				// фильтр
		PERIOD_MEASURE=2,	// период измерения
		NOT_PARAM=255			// отсутствует параметр
}PARAMETER_SELECTION;
// режим энергопотребления дисплея
typedef enum _POWER_MODE_DISPLAY
{	
	ON_DISPLAY_MODE=0,			// включена подсветка		
	OFF_DISPLAY_MODE=1, 		// полное выключение подсветки	
	DISPLAY_BLACKOUT=2			// затемнение дисплея
}POWER_MODE_DISPLAY;

// категория массива
typedef enum _CATEGORY_MASS
{	
	NOT_DANGER=0,			// включена подсветка		
	DANGER=1 					// полное выключение подсветки
}CATEGORY_MASS;
//****************************************************
struct DataDisplay
{
	PARAMETER_SELECTION params;	// параметр который вернул данные
	unsigned char data[30];					// строка возврата
};
// в структуре возвращаются данные выбранные на дисплее
// для параметров FILTER и PERIOD_MEASURE значение соответствующих параметров выбранное в списке
// для параметра DATE_TIME строка в кодировке ASCII формата hh:mm:ss/dd.mm.yyyy с разделительными символами
//****************************************************

#define TIME_START_DISPLAY 3000 		// время для загрузки дисплея
#define PORT_DISPLAY_ON GPIOA	  		// порт включения дисплея
#define PIN_DISPLAY_ON	7						// пин включения дисплея
#define PORT_DISPLAY_RES GPIOA	  	// порт перезагрузки дисплея
#define PIN_DISPLAY_RES	8						// пин перезагрузки дисплея
#define RESIVE_BUFF_SIZE	32				// размер буфера приёма

#define MAX_TIME_UART_WAIT 		10000	// максимальное время на сколько может быть занят uart1 в мс 

//global value:	
		extern osMutexId uart1Mutex;				// мьютекс для разделения uart1 между потоками 

//public:
		void initDisplay(void);																						// инициализация дисплея 
		void onDisplay(void);  																						// подать питание на дисплей
		void offDisplay(void);																						// выключить дисплей		
		void selectDisplay(SELECTION_SCREEN screen);  								// выбор экрана дисплея параметр название экрана
		void setBattaryCharge(unsigned char kol);											// выставить количество делений батареи (0-5)  6 режим зарядки
		void setTimeCountDown(unsigned char min, unsigned char sec); 	// запуск обратного отсчёта времени, параметры min -количество минут, sec- количество секунд
		void setCountImpuls(unsigned short kol);											// установить количество импульсов, параметр количество обнаруженных импульсов
		void setDateTime(unsigned short year,unsigned char mon,
				 unsigned char day,unsigned char hour,unsigned char min); // установить дату время на дисплее 
		void nopCommand(void);																				// пустая команда для вывода из режима пониженного энергопотребления
		void setParameter(PARAMETER_SELECTION parameter,unsigned short value);	// установить значение параметра,параметры 1- номер параметра, 2 -значение параметра
		void sendKey(enum KeyStroke key,struct DataDisplay* resiveData);	// передача навигационных клавиш на дисплей, параметры код клавиши, структура с данными от дисплея
		void selectColumn(unsigned char column);											// подсветить колонку на экране, параметры номер колонки 0-63, если >63 
		void setBarGraph(unsigned short topAxis,unsigned short bottomAxis,unsigned char *pBar);// передать диаграмму на дисплей параметры, максимальное значение по оси Y, максимальное значение по оси х, указатель на массив со значениями столбцов начиная с 0 столбца
		void sendStandBy(unsigned short sec,POWER_MODE_DISPLAY mode);	// перевод дисплея в энергосберегающий режим, параметры количество секунд простоя (без команд) до режима энергосбережения , 2- тип энергосбережения	
		void setProgressBar(unsigned char value);											// вывод прогрессбара по верх всех окон, параметр значение прогресс бара от 0 до 99
		void playWav(unsigned char numberWav, unsigned char volume);	// проигрывание WAV, параметры 1-номер файла 1-3 , 2- громкость 8-127 
		void setResultMeasure(unsigned short N1, unsigned short N2,
					float  N15,float b,CATEGORY_MASS stat1,CATEGORY_MASS stat2);// вывод расчитанных результатов измерений параметры, 1 -кол во импульсов по первому каналу, 
																																			//2- количество импульсов по 2 каналу, 3 -средняя активность 4- амплитудное распределение,5- категория гранит 1, 6- категория гранит 2
		
		
		
//private:
		void initPortDispay(void); 																																	// инициализация порта управления питанием дисплея
		void initUart1(void); 																																// инициализация uart	
		void sendByteUart1(unsigned char *pData,unsigned short size);													// отправка буфера по UART1 параметры указатель на буфер и размер буфера
		unsigned char calcCRC(unsigned char *pData,unsigned short sizeBuff);									// расчёт CRC параметры , указатель на данные и их размер
		void scremble(unsigned char *pData,unsigned short *sizeBuff);													// скремблирование потока данных, входные параметры указатель на данные указатель на размер (буффер должен предусматриать увеличение на размер скремблера)
		void receivingDataUart1(struct DataDisplay* resiveData);															// функция приёма данных по uart1
		void resetDisplay(void);																															// перезагрузка дисплея			
#endif
 		